import axios, {InternalAxiosRequestConfig, AxiosResponse} from "axios";
import {ElMessage} from "element-plus";
import process from "process";

const serves = axios.create({
	baseURL: __CONFIG__.BASE_API,
	timeout: 5000,
	headers: {"Content-Type": "application/json;charset=utf-8"},
});

// 设置请求发送之前的拦截器
serves.interceptors.request.use(
	(config: InternalAxiosRequestConfig) => {
		/**
		 * 设置发送之前数据需要做什么处理
		 * 这里是示范添加了头部授权信息
		 */
		const accessToken = localStorage.getItem("accessToken");
		if (accessToken) {
			config.headers.Authorization = accessToken;
		}
		return config;
	},
	(err) => Promise.reject(err)
);

// 设置请求回应拦截器
serves.interceptors.response.use(
	(res: AxiosResponse) => {
		// 设置接受数据之后，做什么处理
		if (process.env.NODE_ENV === "development") console.log("接收数据", res);
		// 检查配置的响应类型是否为二进制类型（'blob' 或 'arraybuffer'）, 如果是，直接返回响应对象
		if (
			res.config.responseType === "blob" ||
			res.config.responseType === "arraybuffer"
		) {
			return res.data;
		}
		if (res.data.code === 50000) {
			ElMessage.error(res.data.data);
		}
		return res.data.data;
	},
	(err) => {
		// 判断请求异常信息中是否含有超时timeout字符串
		if (err.message.includes("timeout")) {
			console.log("错误回调", err);
			ElMessage.error("网络超时");
		}
		if (err.message.includes("Network Error")) {
			console.log("错误回调", err);
			ElMessage.error("服务端未启动，或网络连接错误");
		}
		return Promise.reject(err);
	}
)

export default serves;

// export interface BaseDataStruct<T> {
//   data: T;
// }
//
// const requestPlus = async <D = any, T = any>(
//   params: AxiosRequestConfig<T>
// ): Promise<BaseDataStruct<D>> => {
//   return await serves(params);
// };
//
// // 将serves抛出去
// export default requestPlus;
